{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Content personalization"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Without context"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This example takes inspiration from Vowpal Wabbit's [excellent tutorial](https://vowpalwabbit.org/tutorials/cb_simulation.html).\n",
    "\n",
    "Content personalization is about taking into account user preferences. It's a special case of recommender systems. Ideally, side-information should be taken into account in addition to the user. But we'll start with something simpler. We'll assume that each user has stable preferences that are independent of the context. We capture this by implementing a \"reward\" function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-12-04T17:50:31.083670Z",
     "iopub.status.busy": "2023-12-04T17:50:31.083311Z",
     "iopub.status.idle": "2023-12-04T17:50:31.114735Z",
     "shell.execute_reply": "2023-12-04T17:50:31.114428Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def get_reward(user, item, context):\n",
    "\n",
    "    time_of_day = context['time_of_day']\n",
    "\n",
    "    USER_LIKED_ARTICLE = 1\n",
    "    USER_DISLIKED_ARTICLE = 0\n",
    "\n",
    "    if user == 'Tom':\n",
    "        if time_of_day == 'morning' and item == 'politics':\n",
    "            return USER_LIKED_ARTICLE\n",
    "        elif time_of_day == 'afternoon' and item == 'music':\n",
    "            return USER_LIKED_ARTICLE\n",
    "        else:\n",
    "            return USER_DISLIKED_ARTICLE\n",
    "    elif user == 'Anna':\n",
    "        if time_of_day == 'morning' and item == 'sports':\n",
    "            return USER_LIKED_ARTICLE\n",
    "        elif time_of_day == 'afternoon' and item == 'politics':\n",
    "            return USER_LIKED_ARTICLE\n",
    "        else:\n",
    "            return USER_DISLIKED_ARTICLE\n",
    "\n",
    "get_reward('Tom', 'politics', {'time_of_day': 'morning'})"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Measuring the performance of a recommendation is not straightforward, mostly because of the interactive aspect of recommender systems. In a real situation, recommendations are presented to a user, and the user gives feedback indicating whether they like what they have been recommended or not. This feedback loop can't be captured entirely by a historical dataset. Some kind of simulator is required to generate recommendations and capture feedback. We already have a reward function. Now let's implement a simulation function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-12-04T17:50:31.117540Z",
     "iopub.status.busy": "2023-12-04T17:50:31.117363Z",
     "iopub.status.idle": "2023-12-04T17:50:31.329078Z",
     "shell.execute_reply": "2023-12-04T17:50:31.328797Z"
    }
   },
   "outputs": [],
   "source": [
    "import random\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "def plot_ctr(ctr):\n",
    "    plt.plot(range(1, len(ctr) + 1), ctr)\n",
    "    plt.xlabel('n_iterations', fontsize=14)\n",
    "    plt.ylabel('CTR', fontsize=14)\n",
    "    plt.ylim([0, 1])\n",
    "    plt.title(f'final CTR: {ctr[-1]:.2%}', fontsize=14)\n",
    "    plt.grid()\n",
    "\n",
    "users = ['Tom', 'Anna']\n",
    "times_of_day = ['morning', 'afternoon']\n",
    "items = {'politics', 'sports', 'music', 'food', 'finance', 'health', 'camping'}\n",
    "\n",
    "def simulate(n, reward_func, model, seed):\n",
    "    \n",
    "    rng = random.Random(seed)\n",
    "    n_clicks = 0\n",
    "    ctr = []  # click-through rate along time\n",
    "    \n",
    "    for i in range(n):\n",
    "        \n",
    "        # Generate a context at random\n",
    "        user = rng.choice(users)\n",
    "        context = {\n",
    "            'time_of_day': rng.choice(times_of_day)\n",
    "        }\n",
    "    \n",
    "        # Make a single recommendation\n",
    "        item = model.rank(user, items=items, x=context)[0]\n",
    "        \n",
    "        # Measure the reward\n",
    "        clicked = reward_func(user, item, context)\n",
    "        n_clicks += clicked\n",
    "        ctr.append(n_clicks / (i + 1))\n",
    "        \n",
    "        # Update the model\n",
    "        model.learn_one(user, item, y=clicked, x=context)\n",
    "        \n",
    "    plot_ctr(ctr)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This simulation function does quite a few things. It can be seen as a simple reinforcement learning simulation. It samples a user, and then ask the model to provide a single recommendation. The user then gives as to whether they liked the recommendation or not. Crucially, the user doesn't tell us what item they would have liked. We could model this as a multi-class classification problem if that were the case.\n",
    "\n",
    "The strategy parameter determines the mechanism used to generate the recommendations. The `'best'` strategy means that the items are each scored by the model, and are then ranked from the most preferred to the least preferred. Here the most preferred item is the one which gets recommended. But you could imagine all sorts of alternative ways to proceed.\n",
    "\n",
    "We can first evaluate a recommended which acts completely at random. It assigns a random preference to each item, regardless of the user."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-12-04T17:50:31.332143Z",
     "iopub.status.busy": "2023-12-04T17:50:31.331942Z",
     "iopub.status.idle": "2023-12-04T17:50:31.623109Z",
     "shell.execute_reply": "2023-12-04T17:50:31.622233Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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Gklm8eLFddapXVY7B+V4fD6fiY2NNUOHDg1ob8gcnunTpxtJ5oEHHvjBvsdzonN4OnfubLKzs012dra59957zbBhw4wkk5SUZNatW1dnvc2bN5v169ebqqqqkxrXD83hqVVcXGwk+T9sNpu59957A+bQ/JC1a9ea6dOnm7Vr15qSkhKTn59v5s2bZ7p3724kmaysrID+tXOXHA6H6dKli1m8eLEpLi42q1atMunp6UaS+c1vfhOwzo4dO8xVV11l4uLiTNu2bU1WVpYpLy83xhgzbtw406VLF1NeXm42btxohg0bZiIiIkxiYqKZPn36Ce8HEC4IPECYOdnAc+jQoTrrjB492kgyO3fuDGh/6623zIgRI0xCQoJxOBwBv5zPOuusgL7hHHjq+0hOTjabNm06pfc/lhMNPLW8Xq/ZtWuXee6550xcXJwZPHhwvV+nhtizZ49p3bq1iYiIMPn5+f72xx57zB+uVq5cGbBOfn6+iYmJMdHR0aaiouIH3yMnJ8fYbDazePFi4/V6zdlnn2169eplFixYYB599FFjs9nM3LlzT2k/gFBj0jJgEbWnso5UO4/F6/X622bMmKFrrrlGq1ev1ogRI3TPPfcoOztb2dnZatGihSorK096DMnJyZKk3bt3n/Q2GiIzM1Om5g83FRQU6Mknn1RBQYGuvPJK/31+mpLdble7du1055136sUXX9TSpUv12GOPndI2k5OTddVVV6m6ujrgtFXtvKt27dqpb9++AeskJiZq0KBBKisr0/r164+7/fLyct1+++265ZZbNGzYMC1cuFDr16/Xc889p8zMTD300EMaPny4/vCHP5zSfgChxhwe4AxSXV2tRx55RG3atNGaNWuUmJjoX2aM0RNPPHFK2x88eLCkmhvf+Xy+kM7jad26te69914dOnRIjz76qB5++GH/BPBwMGLECElqlKvTEhISJNXce6hWt27dJB17kntte3l5+XG3nZ2drdLSUj311FOSpI0bN0oKvO9Pnz599NJLL53M0IEmwxEe4Ayyb98+HTp0SOnp6QFhR5JWrFjxg78Mf0iXLl00ZMgQ7dq1S3/961+P2/dUjiQdz4MPPqiUlBQ999xz2r59e1De42R89913kiSn03nK26o9snPklWaDBg1SVFSUtm7dWu/dktetW1dnnaOtXr1af/jDH/TMM8/UCU5Hfr0qKyuPe8dpIBwReIAzSGJioqKiorRq1aqAOwYfOHBAv/zlLxvlPZ5++mlFRUVpwoQJmjt3br19Pv74Y1100UWN8n5Hi4qK0v333y+Px6NHHnkkYNmWLVu0YcOGBj3ioSHWrVtX752Yy8rKlJWVJUm69NJLA5bt27dPGzZs0L59+wLaj3UfoaefflpLlixR165d9aMf/cjfHhMTozFjxqi0tFSPPvpowDr/93//p3Xr1un8889XmzZt6t2u1+vVrbfeqksvvVTXXnutv/3ss8+WJM2fP19SzVHChQsX+tuB0wWntIAziN1u11133aUZM2aoV69euuKKK1RUVKT3339fHTp0UEpKyim/R+/evfXOO+/o+uuv1w033KDf/e53GjJkiOLj41VYWOh/xEGXLl0aYY/qd/vtt+v3v/+9/va3v+nBBx9U586dJUnDhw9v8H14jrzR4549e+q0PfDAA/772Lz++uuaOXOmzj//fKWlpSk2Nla7d+/W+++/r/379+uCCy7Qr3/964Dt/+lPf9LUqVOVnZ0dcCuCa665Rk6nU/3791e7du1UWlqqzz77TKtXr1ZcXJz+/ve/17k3zuOPP67c3Fw99thj+uSTT9S/f39t2rRJ77zzjlq2bKk///nPx9zPGTNmaMuWLXrnnXcC2jMyMtSjRw/dcccd+uyzz/z3+3nzzTdPqH5A2GjiSdMAjnKyV2nVZ+zYsUaS2bZtm7+tqqrKPPbYY6Zr167G7Xab9u3bm3vuuccUFxfX+94NfbRErf3795tHHnnEDBo0yLRs2dJERESYVq1amaFDh5o//vGPpqSk5JjrnsqjJWo988wzRpIZM2ZMne0eWY8fomNcDVb7cWRdvvjiC3PbbbeZc845x8TFxfn3ediwYebPf/5zvZel19b36EdITJ8+3QwbNsykpKQYt9ttoqKiTPfu3c3dd99tdu3adczx7t+/3/zqV78yqampxul0mqSkJDNmzBizZcuWY66zefNmExUVZZ577rl6l2/atMkMHz7cuN1uk5KSwmMmcFqyGWNMyFMWAABACDGHBwAAWB6BBwAAWB6BBwAAWF7YBZ6PPvpIV1xxhVJSUmSz2TRv3rwfXCc3N1d9+/aV2+1Wly5d/A9fBAAAkMIw8JSWlqpXr1569tlnT6j/tm3bdNlll2nYsGFas2aN7r77bv385z/Xf//73yCPFAAAnC7C+iotm82mf//73xo5cuQx+9x///167733tHbtWn/bDTfcoIMHD2rBggUhGCUAAAh3p/2NB5ctW6aMjIyAtszMTN19993HXKeysjLgNuk+n0+FhYVq1aoVt0sHAOA0YYxRcXGxUlJSfvDZfad94MnLy1NSUlJAW1JSkoqKilReXq6oqKg660ybNk1Tp04N1RABAEAQ7dq1S+3atTtun9M+8JyMSZMm+Z9rI0mHDh1S+/bttW3bNjVv3rxR38vj8WjJkiUaNmxYozw0EPWjzqFBnUODOocOtQ6NYNW5uLhYHTt2PKHf3ad94ElOTlZ+fn5AW35+vmJjY+s9uiNJbrdbbre7Tnt8fLxiY2MbdXwej0fR0dFq1aoV/5mCiDqHBnUODeocOtQ6NIJV59ptnch0lLC7Squh0tPTlZOTE9C2aNEipaenN9GIAABAuAm7wFNSUqI1a9ZozZo1kmouO1+zZo127twpqeZ01E033eTvf8cdd2jr1q36zW9+ow0bNui5557T66+/XueJxAAA4MwVdoFnxYoV6tOnj/r06SNJysrKUp8+fTR58mRJ0p49e/zhR5I6duyo9957T4sWLVKvXr00Y8YMvfzyy8rMzGyS8QMAgPATdnN4hg4dquPdGqi+uygPHTpUq1evDuKoAADA6SzsjvAAAAA0NgIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwPAIPAACwvLAMPM8++6zS0tIUGRmpgQMH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xOSdO3fKbv/+ArMf//jHeu211/Twww/rwQcfVNeuXTVv3jyde+65TbULAAAgjIRl4JGkCRMmHPMUVm5ubp226667Ttddd12QR9Vwbrdb2dnZdU6hoXFR59CgzqFBnUOHWodGONTZZk7kWi4AAIDTWNjdeBAAAKCxEXgAAIDlEXgAAIDlEXgAAIDlEXiC6Nlnn1VaWpoiIyM1cOBALV++vKmHFNY++ugjXXHFFUpJSZHNZtO8efMClhtjNHnyZLVp00ZRUVHKyMjQpk2bAvoUFhZq9OjRio2NVVxcnG699VaVlJQE9Pnqq690wQUXKDIyUqmpqXriiSeCvWthZdq0afrRj36k5s2bKzExUSNHjtTGjRsD+lRUVGj8+PFq1aqVYmJidM0119S5m/nOnTt12WWXKTo6WomJibrvvvtUXV0d0Cc3N1d9+/aV2+1Wly5dNHv27GDvXth4/vnn1bNnT/+N1tLT0/X+++/7l1Pj4Jg+fbpsNlvAjWip9ambMmWKbDZbwEf37t39y0+LGhsExZw5c4zL5TKvvPKK+d///mduu+02ExcXZ/Lz85t6aGFr/vz55qGHHjL/+te/jCTz73//O2D59OnTTYsWLcy8efPMl19+aa688krTsWNHU15e7u/zk5/8xPTq1ct89tln5uOPPzZdunQxN954o3/5oUOHTFJSkhk9erRZu3at+ec//2mioqLMn//851DtZpPLzMw0r776qlm7dq1Zs2aNufTSS0379u1NSUmJv88dd9xhUlNTTU5OjlmxYoUZNGiQ+fGPf+xfXl1dbc4991yTkZFhVq9ebebPn28SEhLMpEmT/H22bt1qoqOjTVZWllm3bp155plnjMPhMAsWLAjp/jaVt99+27z33nvmm2++MRs3bjQPPvigcTqdZu3atcYYahwMy5cvN2lpaaZnz55m4sSJ/nZqfeqys7PNOeecY/bs2eP/2Lt3r3/56VBjAk+QDBgwwIwfP97/2uv1mpSUFDNt2rQmHNXp4+jA4/P5THJysnnyySf9bQcPHjRut9v885//NMYYs27dOiPJfPHFF/4+77//vrHZbGb37t3GGGOee+4507JlS1NZWenvc//995tu3boFeY/CV0FBgZFkPvzwQ2NMTV2dTqd54403/H3Wr19vJJlly5YZY2rCqd1uN3l5ef4+zz//vImNjfXX9je/+Y05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aOLEiUpJSZHb7VbPnj315ptv1ul/6NAhTZ48WT169FBMTIxiY2PVpUsXjR07tt6aAAjEER4AAb744gs98cQTGjZsmH7xi19o9erVmjdvnr7++mutXbtWkZGRp7T9u+++W7Nnz9aXX36piRMnKi4uTlJNAKj1+eefKzMzU6Wlpbr88svVtWtXbd++Xf/4xz/0/vvva9myZerUqVPAdvfv36/09HTFx8frhhtuUEVFhWJjYyVJv//977V582YNGjRIV199tQ4ePKgFCxboF7/4hTZu3KgZM2b4x5Cdna2pU6eqQ4cOuvnmm/3b792793H365NPPlFmZqaqqqp07bXXKi0tTcuWLdPTTz+td999V5999lmd02Aej0cjRozQgQMHdM0116isrExz5szR9ddfrwULFmjEiBGSJGOMMjMz9fnnn2vw4MH6yU9+Irvdrh07dujtt9/WmDFj1KFDh5P4agBnkEZ77jqA09qSJUuMJCPJzJkzJ2DZmDFjjCTzz3/+s8HblWQuvPDCgLaxY8caSWbbtm11+ldVVZm0tDTTvHlzs2rVqoBlH3/8sXE4HObyyy+v8x6SzLhx40x1dXWdbW7durVOm8fjMRdffLFxOBxmx44dPzjmWrV1ys7O9rd5vV7TuXNnI8ksWLAgoP99991nJJlbbrkloL1Dhw5GkrnqqqtMZWWlv/2DDz4wkkxmZqa/7auvvjKSzMiRI+uMp6KiwhQXF9c7VgDf45QWgABDhgzRqFGjAtpuueUWSTVHf4Lt3Xff1fbt23XfffepT58+AcvOP/98XXXVVZo/f76KiooClrlcLj3xxBNyOBx1ttmxY8c6bREREbrjjjvk9Xq1ZMmSUxrz0qVLtWXLFl1yySXKzMwMWDZ58mTFx8frtddeU1VVVZ11//CHP8jlcvlfDx8+XB06dKi31lFRUXXa3G63YmJiTmn8wJmAU1oAAvTr169OW7t27SRJBw8eDPr7f/bZZ5KkjRs31jtPJi8vTz6fT99884369+/vb+/YseMxr5wqLi7WU089pXnz5mnLli0qLS0NWP7dd9+d0phXr14tSfVeyl47X2jhwoXauHGjzjvvPP+yuLi4esNYu3bttGzZMv/rs88+Wz179tQ///lPffvttxo5cqSGDh2q3r17y27n71bgRBB4AASonfdypIiImh8VXq836O9fWFgoSfrHP/5x3H5Hh5akpKR6+1VVVWno0KFatWqV+vTpozFjxqhVq1aKiIjQ9u3b9de//lWVlZWnNObao03HGkObNm0C+tVq0aJFvf0jIiLk8/kCXi9evFhTpkzRW2+9pXvuuUeS1Lp1a02YMEEPPfRQvUe2AHyPwAMgrNQGrnfeeUeXX375Ca9Xe3XV0f7zn/9o1apVuvXWW/Xyyy8HLJszZ47/irFTUTvm/Pz8epfn5eUF9DsZrVq10jPPPKM//vGP2rBhgxYvXqxnnnlG2dnZcjqdmjRp0klvGzgTcCwUQMjVHo2o74jRwIEDJSnglM6p2LJliyTpqquuqrPs448/rncdu93eoKNZtXONai+DP1JpaalWrFihqKgodevW7YS3eSw2m01nn322xo8fr0WLFkmS3n777VPeLmB1BB4AIRcfHy9J2rVrV51lV111ldq3b6+ZM2fqo48+qrPc4/Hok08+OeH3qr1c++h1PvzwQ7300kvHHN+33357wu8xePBgde7cWe+//74++OCDgGWPPvqo9u/frxtvvDFgcnJDbN++vd77INUeUTrVWwUAZwJOaQEIuYsuukhPPfWUbr/9dl1zzTVq1qyZOnTooDFjxsjtduvNN9/UJZdcogsvvFAXXXSRzjvvPNlsNu3YsUMff/yxWrVqpQ0bNpzQe11xxRVKS0vTE088obVr1+rcc8/Vxo0b9e677+rqq6+u9yZ/F110kV5//XWNHDlSffr0kcPh0JVXXqmePXvW+x52u12zZ89WZmamLr30Ul133XXq0KGDli1bptzcXHXu3FnTp08/6XqtWbNGP/3pTzVgwAD16NFDycnJ2r17t+bNmye73a5f//rXJ71t4ExB4AEQcpdccomeeOIJvfTSS5oxY4Y8Ho8uvPBCjRkzRpL0ox/9SF9++aWefPJJzZ8/X0uXLpXb7Vbbtm01cuRI3XjjjSf8XjExMVq8eLHuu+8+ffTRR8rNzdU555yjf/zjH0pKSqo38Dz99NOSpMWLF+udd96Rz+dTu3btjhl4pJpL5j/77DP97ne/08KFC3Xo0CGlpKRo4sSJevjhh0/p2Vv9+/fX/fffr9zcXL333ns6ePCgkpOTlZGRofvuu0+DBg066W0DZwqbMcY09SAAAACCiTk8AADA8gg8AADA8pjDA6BBZs2adUJ3XL755psDHggKAE2JOTwAGiQtLU07duz4wX5Lliyp91ELANAUCDwAAMDymMMDAAAsj8ADAAAsj8ADAAAsj8ADAAAsj8ADAAAsj8ADAAAsj8ADAAAsj8ADAAAsj8ADAAAs7/8DqCGiBVovThIAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from river import reco\n",
    "\n",
    "model = reco.RandomNormal(seed=10)\n",
    "simulate(5_000, get_reward, model, seed=42)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can see that the click-through rate (CTR) oscillates around 28.74%. In fact, this model is expected to be correct `100 * (2 / 7)% = 28.57%` of the time. Indeed, each user likes two items, and there are seven items in total.\n",
    "\n",
    "Let's now use the `Baseline` recommended. This one models each preference as the following sum:\n",
    "\n",
    "$$preference = \\bar{y} + b_{u} + b_{i}$$\n",
    "\n",
    "where\n",
    "\n",
    "- $\\bar{y}$ is the average CTR overall\n",
    "- $b_{u}$ is the average CTR per user minus $\\bar{y}$ -- it's therefore called a *bias*\n",
    "- $b_{i}$ is the average CTR per item minus $\\bar{y}$\n",
    "\n",
    "This model is considered to be a baseline because it doesn't actually learn what items are preferred by each user. Instead it models each user and item separately. We shouldn't expect it to be a strong model. It should however do better than the random model used above."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-12-04T17:50:31.626258Z",
     "iopub.status.busy": "2023-12-04T17:50:31.626074Z",
     "iopub.status.idle": "2023-12-04T17:50:31.721334Z",
     "shell.execute_reply": "2023-12-04T17:50:31.720854Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = reco.Baseline(seed=10)\n",
    "simulate(5_000, get_reward, model, seed=42)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This baseline model seems perfect, which is surprising. The reason why it works so well is because both users have in common that they both like politics. The model therefore learns that the `'politics'` is a good item to recommend."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-12-04T17:50:31.723155Z",
     "iopub.status.busy": "2023-12-04T17:50:31.723022Z",
     "iopub.status.idle": "2023-12-04T17:50:31.733220Z",
     "shell.execute_reply": "2023-12-04T17:50:31.732873Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(Zeros (),\n",
       "            {'politics': 0.06389451550325113,\n",
       "             'music': -0.04041254194187752,\n",
       "             'camping': -0.040319730234734,\n",
       "             'health': -0.03581829597317823,\n",
       "             'food': -0.037778771188204816,\n",
       "             'finance': -0.04029646665611086,\n",
       "             'sports': -0.03661678982763635})"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.i_biases"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The model is not as performant if we use a reward function where both users have different preferences."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-12-04T17:50:31.735061Z",
     "iopub.status.busy": "2023-12-04T17:50:31.734953Z",
     "iopub.status.idle": "2023-12-04T17:50:31.826428Z",
     "shell.execute_reply": "2023-12-04T17:50:31.826129Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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fHx84OzsjOTkZLO79l65cgXPPfdckzzH2rVr4ezsjMjISHz++edW++zfvx/Dhw9vkue7lrOzMxYuXAidTme6902d06dPIz09HTqdrkHHqu9ePmvXrkVCQgI6deqEv/3tb6b2zp07Y/DgwUhISMAPP/xgaq+pqcFrr70GAHjqqafMjlVQUID09HQUFBQ0aEz16dChA0aNGoXMzEzTlWp1li9fjqKiIjz44IP1zi6VlJTg2WefRWRkpNnanK5du6KkpMR0BV5paSn279+Prl273tJ4ieyumW98SETXCAwMtHqn5bq7C0+bNs2sfciQIfXegXfatGkCgMjKyjK1vfDCCwKA6Nixo3j++efFzJkzhb+/vwgLCxP+/v4Wz93YOy0LIcTu3buFp6enACC6desmZs+eLRYvXixmz54tevbsaXr++tzKnZaFEKKyslL4+/sLpVIpMjMzLY57dT2uJzAwUHTs2FE89thj4sUXXxRz5swRffv2FQCEu7u7OHTokMU+qampws3NTajVajF16lTx0ksvie7duwsAIjIy0qJ/XX2t3c152rRppg9XV1fT57/uIy0tzax/Zmam8PHxEQDE2LFjxQsvvCCGDx8uAIjAwEBx8eLFel/rnDlzRLt27URpaalZe2lpqWjVqpXw8fER8+bNE7179xYymUwcPny4QTUkchQMPEQOxtaBp6amRrz55puiU6dOQqPRiHbt2okXXnhBlJaWWn3umwk8Qghx+fJl8frrr4sBAwYIDw8PoVQqhZeXlxg6dKh45513RFlZWb373mrgEUKIdevWCQBi6tSpFsdtaOBZvny5GDZsmPD39xcajUY4OzuLLl26iPnz54tz587Vu196erp45JFHhKenp9BoNKJnz55i/fr1wmg0WvS9XuABcN0Pa5+TnJwcMX36dOHn5ydUKpVo27atmDt3rsjLy6t3vAcOHBAymczs7TCudvjwYdG/f3+hVqtFcHBwvW8ZQuTIZEI04u17iYiIiG5DXMNDREREksfAQ0RERJLHwENERESS53CBZ9++fRg3bhz8/f0hk8mwbdu2G+6TmJiIu+++GxqNBh07djS9+SIRERER4ICBp7y8HL1798b69esb1D8rKwtjx47FsGHDkJKSgvnz5+Opp57Cjz/+aOOREhER0e3Coa/Skslk+OabbzBhwoR6+yxcuBA7duxAamqq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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "simulate(\n",
    "    5_000,\n",
    "    reward_func=lambda user, item, context: (\n",
    "        item in {'music', 'politics'} if user == \"Tom\" else\n",
    "        item in {'food', 'sports'}\n",
    "    ),\n",
    "    model=model,\n",
    "    seed=42\n",
    ")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A good recommender model should at the very least understand what kind of items each user prefers. One of the simplest and yet performant way to do this is Simon Funk's SGD method he developed for the Netflix challenge and wrote about [here](https://sifter.org/simon/journal/20061211.html). It models each user and each item as latent vectors. The dot product of these two vectors is the expected preference of the user for the item."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-12-04T17:50:31.827897Z",
     "iopub.status.busy": "2023-12-04T17:50:31.827802Z",
     "iopub.status.idle": "2023-12-04T17:50:31.959947Z",
     "shell.execute_reply": "2023-12-04T17:50:31.959498Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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IB4iIiKHwMBDREREksfAQ0RERJLHwENERESSx8BDREREksfAYwd8DA8REVHDYuAhIiIiyWPgISIiIslj4LEhGfggHiIiIkfAwENERESSx8BDREREksfAQ0RERJLHwENERESSx8BDREREksfAQ0RERJLHwENERESSx8BjQzI+hoeIiMghMPAQERGR5DHwEBERkeQx8BAREZHkMfDYgWjoCRARETVyDDxEREQkeQw8REREJHkMPERERCR5DDxEREQkeQw8REREJHkMPERERCR5DDxEREQkeQw89sAH8RARETUoBh4iIiKSPAYeIiIikjwGHiIiIpI8Bh4bkskaegZEREQEMPAQERFRI8DAQ0RERJLHwENERESSx8BjB3wMDxERUcNyyMCzZs0ahISEwMnJCREREThw4MAN+69atQrt2rWDs7MzgoKC8OKLL6KiosJOsyUiIiJH53CB5+uvv0ZsbCzi4uJw+PBhdOvWDdHR0cjNzbXa/8svv8Qrr7yCuLg4nDhxAp9++im+/vprzJs3z84zJyIiIkflcIFn5cqVmDp1KqZMmYKOHTviww8/hIuLC9atW2e1/759+9C3b188/vjjCAkJwbBhwzBu3LibnhUiIiKixkPZ0BO4lk6nw6FDhzB37lxzm1wuR1RUFFJSUqzuc/fdd+N///sfDhw4gN69e+PMmTPYunUrJkyYUONxtFottFqt+XVRUREAQK/XQ6/X19O7AYwGo/n/63Ncqq6qvqyzbbHO9sE62w9rbR+2qnNdxnOowJOfnw+j0Qg/Pz+Ldj8/P6Snp1vd5/HHH0d+fj769esHIQQMBgOmTZt2w0taS5cuxcKFC6u1b9++HS4uLrf3Jq5xsRSoKnFCQkK9jUs1Y53tg3W2D9bZflhr+6jvOpeVldW6r0MFnluRnJyMJUuW4IMPPkBERAROnTqFGTNmYNGiRXj99det7jN37lzExsaaXxcVFSEoKAjDhg2Du7t7vc3txN/FWP575ZmpoUOHQqVS1dvYZEmv1yMhIYF1tjHW2T5YZ/thre3DVnWuukJTGw4VeHx8fKBQKJCTk2PRnpOTA39/f6v7vP7665gwYQKeeuopAECXLl1QWlqKp59+Gq+++irk8urLlDQaDTQaTbV2lUpVr38RSuXV8tb32GQd62wfrLN9sM72w1rbR33XuS5jOdSiZbVajV69eiEx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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = reco.FunkMF(seed=10)\n",
    "simulate(5_000, get_reward, model, seed=42)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can see that this model learns what items each user enjoys very well. Of course, there are some caveats. In our simulation, we ask the model to recommend the item most likely to be preferred for each user. Indeed, we rank all the items and pick the item at the top of the list. We do this many times for only two users.\n",
    "\n",
    "This is of course not realistic. Users will get fed up with recommendations if they're always shown the same item. It's important to include diversity into recommendations, and to let the model explore other options instead of always focusing on the item with the highest score. This is where evaluating recommender systems gets tricky: the reward function itself is difficult to model.\n",
    "\n",
    "We will keep ignoring these caveats in this notebook. Instead we will focus on a different concern: making recommendations when context is involved."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## With context"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We'll add some context by making it so that user preferences change depending on the time the day. Very simply, preferences might change from morning to afternoon. This is captured by the following reward function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-12-04T17:50:31.961622Z",
     "iopub.status.busy": "2023-12-04T17:50:31.961514Z",
     "iopub.status.idle": "2023-12-04T17:50:31.971477Z",
     "shell.execute_reply": "2023-12-04T17:50:31.970257Z"
    }
   },
   "outputs": [],
   "source": [
    "times_of_day = ['morning', 'afternoon']\n",
    "\n",
    "def get_reward(user, item, context):\n",
    "    if user == 'Tom':\n",
    "        if context['time_of_day'] == 'morning':\n",
    "            return item == 'politics'\n",
    "        if context['time_of_day'] == 'afternoon':\n",
    "            return item == 'music'\n",
    "    if user == 'Anna':\n",
    "        if context['time_of_day'] == 'morning':\n",
    "            return item == 'sports'\n",
    "        if context['time_of_day'] == 'afternoon':\n",
    "            return item == 'politics'"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We have to update our simulation function to generate a random context at each step. We also want our model to use it for recommending items as well as learning."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-12-04T17:50:31.973652Z",
     "iopub.status.busy": "2023-12-04T17:50:31.973532Z",
     "iopub.status.idle": "2023-12-04T17:50:31.982707Z",
     "shell.execute_reply": "2023-12-04T17:50:31.982189Z"
    }
   },
   "outputs": [],
   "source": [
    "def simulate(n, reward_func, model, seed):\n",
    "    \n",
    "    rng = random.Random(seed)\n",
    "    n_clicks = 0\n",
    "    ctr = []\n",
    "    \n",
    "    for i in range(n):\n",
    "        \n",
    "        user = rng.choice(users)\n",
    "        \n",
    "        # New: pass a context\n",
    "        context = {'time_of_day': rng.choice(times_of_day)}\n",
    "        item = model.rank(user, items, context)[0]\n",
    "        \n",
    "        clicked = reward_func(user, item, context)\n",
    "        n_clicks += clicked\n",
    "        ctr.append(n_clicks / (i + 1))\n",
    "        \n",
    "        # New: pass a context\n",
    "        model.learn_one(user, item, clicked, context)\n",
    "        \n",
    "    plot_ctr(ctr)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Not all models are capable of taking into account context. For instance, the `FunkMF` model only models users and items. It completely ignores the context, even when we provide one. All recommender models inherit from the base `Recommender` class. They also have a property which indicates whether or not they are able to handle context:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-12-04T17:50:31.986221Z",
     "iopub.status.busy": "2023-12-04T17:50:31.986080Z",
     "iopub.status.idle": "2023-12-04T17:50:31.994905Z",
     "shell.execute_reply": "2023-12-04T17:50:31.994636Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = reco.FunkMF(seed=10)\n",
    "model.is_contextual"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's see well it performs."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-12-04T17:50:31.996971Z",
     "iopub.status.busy": "2023-12-04T17:50:31.996777Z",
     "iopub.status.idle": "2023-12-04T17:50:32.162880Z",
     "shell.execute_reply": "2023-12-04T17:50:32.162600Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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IB4iIiKHwMBDREREksfAQ0RERJLHwENERESSx8BDREREksfAYwd8DA8REVHDYuAhIiIiyWPgISIiIslj4LEhGfggHiIiIkfAwENERESSx8BDREREksfAQ0RERJLHwENERESSx8BDREREksfAQ0RERJLHwENERESSx8BjQzI+hoeIiMghMPAQERGR5DHwEBERkeQx8BAREZHkMfDYgWjoCRARETVyDDxEREQkeQw8REREJHkMPERERCR5DDxEREQkeQw8REREJHkMPERERCR5DDxEREQkeQw89sAH8RARETUoBh4iIiKSPAYeIiIikjwGHiIiIpI8Bh4bkskaegZEREQEMPAQERFRI8DAQ0RERJLHwENERESSx8BjB3wMDxERUcNyyMCzZs0ahISEwMnJCREREThw4MAN+69atQrt2rWDs7MzgoKC8OKLL6KiosJOsyUiIiJH53CB5+uvv0ZsbCzi4uJw+PBhdOvWDdHR0cjNzbXa/8svv8Qrr7yCuLg4nDhxAp9++im+/vprzJs3z84zJyIiIkflcIFn5cqVmDp1KqZMmYKOHTviww8/hIuLC9atW2e1/759+9C3b188/vjjCAkJwbBhwzBu3LibnhUiIiKixkPZ0BO4lk6nw6FDhzB37lxzm1wuR1RUFFJSUqzuc/fdd+N///sfDhw4gN69e+PMmTPYunUrJkyYUONxtFottFqt+XVRUREAQK/XQ6/X19O7AYwGo/n/63Ncqq6qvqyzbbHO9sE62w9rbR+2qnNdxnOowJOfnw+j0Qg/Pz+Ldj8/P6Snp1vd5/HHH0d+fj769esHIQQMBgOmTZt2w0taS5cuxcKFC6u1b9++HS4uLrf3Jq5xsRSoKnFCQkK9jUs1Y53tg3W2D9bZflhr+6jvOpeVldW6r0MFnluRnJyMJUuW4IMPPkBERAROnTqFGTNmYNGiRXj99det7jN37lzExsaaXxcVFSEoKAjDhg2Du7t7vc3txN/FWP575ZmpoUOHQqVS1dvYZEmv1yMhIYF1tjHW2T5YZ/thre3DVnWuukJTGw4VeHx8fKBQKJCTk2PRnpOTA39/f6v7vP7665gwYQKeeuopAECXLl1QWlqKp59+Gq+++irk8urLlDQaDTQaTbV2lUpVr38RSuXV8tb32GQd62wfrLN9sM72w1rbR33XuS5jOdSiZbVajV69eiEx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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "simulate(5_000, get_reward, model, seed=42)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The performance has roughly been divided by half. This is most likely because there are now two times of day, and if the model has learnt preferences for one time of the day, then it's expected to be wrong half of the time.\n",
    "\n",
    "Before delving into recsys models that can handle context, a simple hack is to notice that we can append the time of day to the user. This effectively results in new users which our model can distinguish between. We could apply this trick during the simulation, but we can also override the behavior of the `learn_one` and `rank` methods of our model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-12-04T17:50:32.164572Z",
     "iopub.status.busy": "2023-12-04T17:50:32.164472Z",
     "iopub.status.idle": "2023-12-04T17:50:32.301735Z",
     "shell.execute_reply": "2023-12-04T17:50:32.301435Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjwAAAHOCAYAAACcvdMVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABLHUlEQVR4nO3deVyU9f7//+fMAAOIuKEgLuBSLplaejSy1BKlPeucMuuYWVmZfr4aHU/ZInqs7LSYnrI6rdbvVJottplJKtlCmguaZZgmbgVusQgKA/P+/YGMjqCCMgvD4367cWPmfb2va17z1pxn7+t9XWMxxhgBAAAEMKuvCwAAAPA0Ag8AAAh4BB4AABDwCDwAACDgEXgAAEDAI/AAAICAR+ABAAABj8ADAAACHoEHAAAEPAIP4GccDoemTJmiM844Q3a7XRaLRQsWLFBWVpYsFotuueUWr9YzZcoUWSwWpaWlefV1AaA2EXgAP/P0009r6tSpio2N1T/+8Q+lpKSoc+fOvi6rxv7880898sgjSkhIULNmzRQcHKzmzZsrMTFRzz77rA4cOCBJslgsNfqR5Ap/R/8EBwerVatWuv7667Vq1apaex87d+7UnXfeqbZt2yokJESxsbEaNWqUduzYUWV/p9Op5557Tueee67Cw8MVGRmp/v376+OPPz6tOkpKStSzZ09ZLJYT/n344YcfdNlll6lx48Zq0KCBzjvvPL377rtV9v3222+VkJCghg0bqkuXLnrllVeq7JeTk6OmTZvqscceO633APhSkK8LAODu008/VUREhFJTUxUSEuJqdzgc2rhxoxo1auTD6qpnyZIluv7667V//3516dJF1113nZo1a6Z9+/Zp+fLl+n//7/9p5syZ2rJli1JSUirtP3PmTOXl5VW57WgdOnTQ3//+d0lSYWGhVq9erfnz52vBggX68ssv1b9//9N6H1u2bNH555+v3bt3a8iQIRo2bJh+/fVXvfHGG1q4cKG+++47dejQwdXfGKPrr79e77//vjp06KDbbrtNxcXF+uijj3T11Vfr2Wef1bhx406plqlTp2rz5s0n7LNs2TIlJSUpNDRUN9xwgxo2bKj3339fw4YN044dO3Tvvfe6+m7fvl1DhgxRdHS07rzzTqWnp2v06NFq2rSprr32Wrfj/t///Z/atGmjf/7zn6dUO+AXDAC/0q5dOxMXF+frMlxSUlKMJLNs2bJq9c/IyDBhYWEmLCzM/O9//6uyz7Jly8x555133GPExcWZE/3ztHXrViPJJCUlVdo2ffp0I8n079+/WvWeyOWXX24kmVmzZrm1v/vuu1W+/vz5840k069fP1NUVORq37Nnj4mLizN2u91s3bq1xnWsWLHC2Gw289xzzxlJplOnTpX6OBwO06FDB2O3283atWtd7bm5uebMM880ISEhJisry9X+2GOPGavVarZt22aMMaa0tNSceeaZld7Txx9/bGw2m1m5cmWN6wb8CYEH8BMVweLYn4rwU/EhP3LkSLf9BgwYYCSZkpISk5KSYuLi4kxISIg544wzzOzZsyu9zq5du8zkyZNN3759TfPmzU1ISIiJi4szY8aMMTk5Ocetq7qBp3///kaSeeWVV07Y79ChQ8fddjqBZ/fu3UaSadCgQbXqPZ6DBw+aoKAgEx0dbZxOZ6XtPXv2NJLMli1bXG1///vfjSTz2WefVeo/c+ZMI8lMnjy5xnV07tzZDBgwwDidzuMGni+++MJIMqNGjaq0bc6cOUaSmTp1qqttzJgxJjo62q3f9ddfb7p06eJ6npeXZ1q3bm3uueeeGtUM+CNOaQF+YuDAgZLKT+dI0oQJEyRJjRs3rtb+w4cP18qVK3XppZfKZrPp3Xff1dixYxUcHKzRo0e7+i1fvlxPP/20Bg0apL59+yo4OFhr167VCy+8oC+++EJr1qw55dNmmzdv1vLly9WmTRuNGjXqhH3tdvspvUZ1BQVV/uctPj5e27Zt09atWxUfH3/C/fft26fS0lLFxcW51g4drV27dsrIyNCyZcvUvn17SVJ2drZrW1X9JWnp0qWaOnVqtd/HAw88oO3bt+vTTz+tso4KFYvKhwwZUmlbUlKSJOmrr75ytbVp00Z79+7Vzp071bp1azmdTq1bt85tXO6//34FBQVp2rRp1a4X8FcEHsBPDBw4UAMHDtScOXMklV8dVRM7d+7Uhg0bFBkZKUkaP368unXrpqefftot8Fx88cXKzs5WRESE2/5vvvmmRo4cqeeee04PPvjgKb2Hb7/9VpI0YMAAWa2+uSaiYuHtBRdccFrHadKkiWw2m7Zt2yZjTKWwsXXrVknSpk2bXG1RUVGubV26dDlp/5NZvny5Zs2apRkzZritFarKr7/+Kkk644wzKm2LiYlRRESEq48k3XjjjZo2bZoGDhyoa665Runp6crMzHQtTP7222/13//+VwsXLlSDBg2qXTPgr7hKCwgQ06dPd4UdSerUqZP69eunzMxMFRQUuNpbtGhRKexI0ogRIxQZGakvv/zylGuomOFo3br1KR+jJjZv3qwpU6ZoypQpmjhxoi6++GI98MADio6O1pNPPlmp/5IlS7Rx40a1atXqpMcODw9X//79lZOTo+eff95t2wcffKCMjAxJUm5urqv90ksvlSQ9/vjjOnTokKt93759rpm7o/ufSGFhoUaNGqWEhAT93//930n75+XlSdJxZ+ciIyNdfSQpLi5OX3zxhZo1a6YXXnhBe/fu1csvv6xrr71WJSUlGj16tG688UYlJSVp4cKF6tKli4KCgtS5c2d9/vnn1XoPgD9hhgcIEL169arUVhE8cnNz1bBhQ1f7Bx98oP/+979as2aN/vzzT5WVlbm2/f77754vtpZs2bKl0umhmJgYff311+rYsWOl/iebJTnWM888owsuuEDjxo3TJ598ou7du2vz5s366KOP1L17d61fv95tJuvGG2/UnDlztGzZMp199tm65JJL5HA4tGDBAkVHR0tStWe+/vGPf+j333/X559/7rHZsgsvvFArVqyo1P7II49oz549euaZZ7Rt2zZdc801uvbaa/Xcc8/p1Vdf1TXXXKNNmzapbdu2HqkL8ARmeIAAcfTsToWKdSxHB5qnn35af/3rX7V27VoNGTJE9957r1JSUpSSkqJGjRqpuLj4lGuIiYmRJO3ateuUj1ETSUlJMuUXX2j37t168skntXv3bl111VWu+/ycjh49euiHH37Q9ddfrzVr1mjWrFnKzMzUf//7X40YMUJS+YxZhaCgIH3++eeaMmWKrFarXnrpJX3wwQe6+uqr9d5771XqfzxpaWl68cUXNW3aNJ155pnVqrViZufoWZyj5efnV2tt1k8//aTHH39czzzzjKKiovTCCy8oNDRUr732mgYNGqRXX31VdrtdL7zwQrXqAvwFMzxAPVJaWqpp06apZcuWysjIcPvwNcboiSeeOK3j9+vXT1L5B7bT6fTqOp7mzZvrH//4h/Ly8vTII4/ooYcecp1GOh2dO3fWvHnzKrVX3PG6d+/ebu12u90VII9Wsaj42P5VqThdNnHiRE2cOLHS9szMTFksFjVq1Mh1iqxi7c6vv/5aabYvOztbBw4cUJ8+fU74uk6nU7fffrsGDRrkur9RZmamOnXqpLCwMElSWFiYOnXqpF9++eWk7wPwJwQeoB7Zu3ev8vLyNGjQoEozDatWrdLBgwdP6/gdO3ZU//79tXz5cr3xxhsnvFKruLjYI1dqPfDAA3rttdf0/PPPa8KECSe9GutUFBQU6JNPPlGzZs00ePDgau3z1ltvSZJuuOGGk/bt1q2bbrvttiq3vfrqq2rUqJH+9re/KTw83NU+YMAATZ8+XYsXL670Gl988YWrz4k899xz+vHHH7Vhwwa39mNn/YqLi094xRjgl3x7VTyAY8XFxVV548GT3YenKiNHjjSSXDe7KysrM2FhYSY+Pt4UFha6+u3fv9/07dvX7b4/FWp6H561a9easLAwEx4ebubOnVtln+XLl5vzzz//uMc4nfvwGGPMrFmzjCRz6623urVv3rzZbNy40ZSUlFTjnRhTVFRkHA6HW9uhQ4fMddddV+UNCY0pv3fNsebPn2+sVqv5y1/+YkpLS9227dmzx2zcuNHs2bOnWjXpBDcebN++/QlvPHiimx5u27bNREREmBkzZri1T5o0ydhsNtdNC7OysozNZjMPPPBAteoF/AVreIB6xGq16u6771ZWVpZ69Oih5ORk3X777erWrZusVqtiY2NP+zV69uypTz75xPX1BmeddZbGjBmjBx98UGPGjFH37t3Vv39/7d69uxbeUdXuuOMOxcbG6s0339SWLVtc7YMGDVKXLl2qvcZo9erVio2N1U033aT7779fd999t84880zNnz9fo0ePrvLqqb59+2rIkCEaP3687rvvPl100UW67rrrFB8fr/nz58tms7n1f+6559SlSxc999xzp/Weg4KC9Morr8jpdKp///664447dO+996pHjx7atGmTHnvssRPOdo0ZM0ZdunTR+PHj3drvuusuBQUF6eKLL9Y999yjiy++WMHBwRozZsxp1Qt4G4EHqGemT5+uRx99VBaLRc8//7xSU1M1fPhwLV68WMHBwbXyGoMGDdKvv/6qadOmKTIyUvPmzdMTTzyh+fPnq1mzZvrPf/7jWqfiCaGhoZo0aZJKS0trdJO/Y7Vt21YDBw7U119/rWeeeUbvvPOOOnbsqPfee08vvfRSlad1hg0bpuzsbL3++uv6z3/+o5ycHD300ENau3at4uLiTudtndRFF12kb775Rv369dO8efP0wgsvKDo6WnPnznX7Hq1jvf3221q8eLFeeeWVSuuu2rZtqwULFigsLEyzZ89WWFiYPvroI6/degCoLRZjjPF1EQAAAJ7EDA8AAAh4BB4AABDwCDwAACDg+V3gWb58ua688krFxsbKYrFowYIFJ90nLS1N5557rux2uzp27Oj68kUAAADJDwNPYWGhevToodmzZ1er/9atW3X55ZfroosuUkZGhiZMmKDbb7/ddaMtAAAAv75Ky2Kx6MMPP9TQoUOP2+e+++7TZ5995nZn0BtuuEG5ublatGiRF6oEAAD+rs5/tUR6eroSExPd2pKSkjRhwoTj7lNcXOx2q3Sn06n9+/erWbNm3C4dAIA6whijgoICxcbGnvS7++p84MnOzlZ0dLRbW3R0tPLz83Xw4EHXF94dbfr06ad1MzIAAOA/duzYcdKbYdb5wHMqJk2apOTkZNfzvLw8tW3bVlu3blXDhg1r9bUcDoeWLVumiy66qNbuYovKGGfvYJy9g3GuGWOMypxGTlP+2Gkk5+HfOuq5a5uO9HU4SvXtd+nqe955stlslfsayRx1PKcxUsVzGfdtTlN1vyrqKn9uZFT+Gjp8rPLd3Gsv73P09iM1mcPHkuQ6bsUxjJGcOvLYtY+O7nfUY1c9Fe/rSF3OKurSUceTdNT7OfZ45WNjLdyrp0cOqNW/0wUFBWrXrl21PrvrfOCJiYlRTk6OW1tOTo4iIyOrnN2RJLvdXuW3NDdt2lSRkZG1Wp/D4VB4eLiaNWvGP1wexDh7B+Ncc8YYlTrLP5BLnUZlZUalTueR567fTpU6jUrLjIpLjHLKwvVbgVWyGjmdUpkxch7uX/HYaapud2878kF8pF3H6Vv+QVVWRbvzqGMd6ev+GlXWYMpf70goMZUCxJHnVYQD58n7n75IKfPn2jgQTiA+okGt/9tRcazqLEep84EnISFBCxcudGtLTU1VQkKCjyoCcKqMMXIcDgSOUiOH0ylHmfvj0jKjksO/HWWHt5cZlZY53dudRo5SZ/mxjulb8bi0rIrQUWaOCSPl4cRRVjmclB0OKFW2VwSAU/5EDpI2/FCr4wvJYpGsFouslvIPSatFcpaVKTg46HB7eZvVYnFtP7q/zXr0drn2cT22Hn9f6zH9K9osOnI8qaK/3Pod3cd6+LmlYruO6WvR4eMeeW2L2/Oq2449bsVzq9XiNnaVXk9ye49yva8jtZSVObX1l/W++CN38bvAc+DAAW3evNn1fOvWrcrIyFDTpk3Vtm1bTZo0Sbt27dKbb74pqfybfJ977jn985//1K233qqlS5fq3Xff1WeffeartwDUOaVlTh10lOmQw6lDjjIdcpSpuNR5+KdMJYcfHyx26Ic9FuX/sFNlRiopc6rYUR40ikudrn4V+1Q8L6loK3NvKyl1DymltfO/63WCzVr+4Rnk9tt6+LdUfPCgGkY0UJDNevhD9vCHrdUim6V8f4vFIlsV7e59LYf76pi+lqP66pi+FY9VRd+j91cVNRze75i2ijBgs5S3HfmArDpAHC8kVOxb7f7HHP/YmQCHw6GFCxfqssuSmLX0IIfDoYU563xag98FnlWrVumiiy5yPa9YazNy5EjNmTNHf/zxh7Zv3+7a3q5dO3322We65557NGvWLLVu3VqvvPKKkpKSvF474AnGGB1yOHWguFRFJaUqLC5TYUmpCovLHxeVlOqQo8wVWA46ynSwpEzFpeW/j24vPtzPFW5KynSotEyOspoEDZu02XvT/8E2i4Jt5UEgJMiqIKtVwUEWBVut5e2Ht4cc9di1T8Xjw/sEWa2Hj3GkX5DNepzQYVGQ7fjtQVare2CxVdHP9dsq2+HtFW0nmoI/8iF8AR/CQC3xu8AzcOBAnejWQFXdRXngwIFau3atB6sCaq7MaVRwyKH8g6XKP+Qo/6l4fNChgkOlrhBzoLhMRcWlh4PMkUBTdPixNyc+woJtCg22yh5kU0iQVfag8pAQEmRViM2ivP371LpltOwhQbLbrLIHl4cNe7BNITZrpX2OPc6Rfcrbg10h5UgAqQgvQScJBgBQXX4XeAB/c8hRptwih/YXlujPohLtLyxRblGJ9hc69GdRifIOlgeYikBTcMih/MNhpraFh9jUwB6kBq7fQQq32xQWXP5jP/w7NNha3hZypO3o9tAQm0KDyre72oJtsgdZqznzcA4zDwDqFAIP6h1jjHKLHNpzoFh7Coq1u+BQ+e/8Yu05UHw40BwJOEUlZaf1emHBNjUMDVJkWLAiXb+D1TA0SBGh5aHFLcTYba628BCbIuxBCrcHKTzY5lo8CACoGQIPAoqjzKmcA0X6PfeQfs89qF25B/VH3kFl55WHmT35h7TnQHEN16yULwRtEh6ipg2C1SQ8pPynQfnzRocDTKTrd5AahpaHm4ahwQoJ8ruvrAOAeofAgzrF6TTKKTikrL1FytpXqKx9hfo995B2/Vmk37Jtuuf7L6u93qVxeLBaNLSreUO7WjQMVfOGdkVFhKhZA7uaNghR4/BgNW1QHmwa2oNYSwIAdRiBB36p4JBDm3IOaFNOgbL2Fmrr3kJt21ekbfsLdcjhPM5e5YEkxGZVy8ahim0UptjGYYptHKqYRqFqHmFXi8gjwcYeZPPeGwIA+BSBBz7lKHMqM7tAmdkF2pRToMycAm3KLtDveYeOu4/NalGbJmGKj2qguKbhatM0XC0igpX10xr97bJBimncgLUuAAA3BB54TZnTaPPuA1q/M1c/7srTup152vhHvkpKq56xiYkM1RnREerQPELxzcIVH9VA8c0aqFWTMAXb3NfFOBwOLdwuNW9oJ+wAACoh8MBjDjnKtH5nnlZu3acVW/dr9bY/q7ziKTI0SF1jI9UpuqHOiG6oTjENdWaLhmoUzmXPAIDaQeBBrXE6jTb8nqe0zD36ZvNeZezIrTR70yDEpm6tGql760Y6u3Vj9WjdSG2bhrMgGADgUQQenJb8Qw6lZe5R2i+7tfzXPdp7oMRte/OGdvVp11R92zXVX+Kb6szohrJxygkA4GUEHtRYwSGHlmzcrU/X/6Hlm/aopOzILE6EPUgXdIxS/zObK6FDM8U3Y/YGAOB7BB5Ui9Np9M3mvZr3ww6lbsxxO1XVvnkDDe4SrYGdWqhXXBNutAcA8DsEHpzQ7vxDmvfDDs1btUM7/zzoam8f1UBXdG+py7vH6szoCGZxAAB+jcCDKm3efUAvL/9NH67d5TplFRkapGvOaaXrerfRWbGRhBwAQJ1B4IGbn37P0zOpv+rLjTmutnPbNtbfz4vTZWe3VGgwdycGANQ9BB5IkrL2FmpG6iZ9vO53SZLFIg3uEq07B7RXr7imPq4OAIDTQ+Cp5wqLS/WfJb/q1W+2qvTwt25e1SNW4xPPUIfmET6uDgCA2kHgqce++ClbUz/+yfW9VQM7NdfEpE46K7aRjysDAKB2EXjqofxDDj28YIM+yig/fdWmaZj+dVU3XdS5hY8rAwDAMwg89cwPWfs1YW6GduUelNUi3TWgg/7v4jMUFsJiZABA4CLw1BPGGL3xXZamfbZRZU6jtk3D9cywnuoV18TXpQEA4HEEnnqguLRMkxf8pHmrdkiSru4Zq0evOVsRdv74AQD1A594Aa6opFR3/n+r9fWve2W1SJMu7aLbL2zHTQMBAPUKgSeA5R106NY5P2j1tj8VHmLT7JvO1UWdWJgMAKh/CDwB6kBxqUa8ukLrd+YpMjRIr4/qw3odAEC9ReAJQIccZbrjzVVavzNPTRuE6K3b+6pLy0hflwUAgM9YfV0AapfTaXTPvAx9t2WfGoTY9MaoPoQdAEC9R+AJMLOW/KrPN2QrxGbVyyN76+zW3DUZAAACTwBZ/FO2Zi35VZL06DXddH6HKB9XBACAfyDwBIidfxbp3nfXSZJuOT9e1/Vu4+OKAADwHwSeAOB0Gt377joVFJfqnLaN9eDlXXxdEgAAfoXAEwBe/WarVmzdr/AQm565vqeCbfyxAgBwND4Z67gd+4v01OJMSdLDV3RVfFQDH1cEAID/IfDUcdM+/VnFpU6d176pbvgL63YAAKgKgacOW5a5W4t/zlGQ1aJ/Xd2N78cCAOA4CDx1VJnT6LHPNkqSRvWL15nRDX1cEQAA/ovAU0d9vG6Xft19QI3CgjXu4jN8XQ4AAH6NwFMHOcqceia1/AaDd/Rvr0ZhwT6uCAAA/0bgqYM+XLtL2/cXKSoiRKP6xfu6HAAA/B6Bp44xxujVr7dKkm6/sL3CQ/jCewAATobAU8d8s3mvMnMKFB5i0/A+bX1dDgAAdQKBp4559Zvy2Z3re7dh7Q4AANVE4KlDtu8rUlrmHlksYu0OAAA1QOCpQ95bvUOSdEHHKMU14yskAACoLgJPHVHmNHpv9U5J0nW9+QoJAABqgsBTR3y3Za9+zzukyNAgDeka7etyAACoUwg8dcSHa3dJkq7qGavQYJuPqwEAoG4h8NQBJaVOfflzjiTpyu6xPq4GAIC6h8BTB6T/tk/5h0oVFRGi3vFNfV0OAAB1DoGnDli04Q9J0pCzYmSzWnxcDQAAdQ+Bx885nUaLfyo/nXVptxgfVwMAQN1E4PFzG37P077CEkXYg3Re+2a+LgcAgDqJwOPnvv51ryTp/A7NFGzjjwsAgFPBJ6if+2rTHknShWc293ElAADUXQQeP3aguFRrtv0pSRpwBoEHAIBTReDxY+lb9qnUaRTXLFxtm4X7uhwAAOosAo8fW/HbPklSv45RPq4EAIC6jcDjx1YdPp31l/gmPq4EAIC6jcDjpw45yvTT73mSpN5x3F0ZAIDTQeDxU+t25MpRZtSioV2tm4T5uhwAAOo0Ao+fqjid1Tu+iSwWvk4CAIDTQeDxU6sPB55enM4CAOC0EXj8kDFG63fmSpLOadvYp7UAABAI/DLwzJ49W/Hx8QoNDVXfvn21cuXKE/afOXOmOnXqpLCwMLVp00b33HOPDh065KVqa9/ugmLtPVAiq0XqEhPp63IAAKjz/C7wzJs3T8nJyUpJSdGaNWvUo0cPJSUlaffu3VX2f/vtt3X//fcrJSVFGzdu1Kuvvqp58+bpgQce8HLltafi6qwOzSMUFmLzcTUAANR9fhd4ZsyYodGjR2vUqFHq2rWrXnzxRYWHh+u1116rsv93332nfv366cYbb1R8fLyGDBmi4cOHn3RWyJ/9tCtfknRWLLM7AADUhiBfF3C0kpISrV69WpMmTXK1Wa1WJSYmKj09vcp9zj//fP3vf//TypUr1adPH/32229auHChRowYcdzXKS4uVnFxset5fn55wHA4HHI4HLX0buQ65tG/q6Ni/U7nmIharydQnco4o+YYZ+9gnL2HsfYOT41zTY7nV4Fn7969KisrU3R0tFt7dHS0fvnllyr3ufHGG7V3715dcMEFMsaotLRUd9111wlPaU2fPl1Tp06t1L548WKFh3vmO6tSU1Or3Xf1bzZJFh3YvlEL8372SD2BqibjjFPHOHsH4+w9jLV31PY4FxUVVbuvXwWeU5GWlqbHHntMzz//vPr27avNmzdr/PjxmjZtmh5++OEq95k0aZKSk5Ndz/Pz89WmTRsNGTJEkZG1exrJ4XAoNTVVgwcPVnBw8En7FxxyaH/6MknSLUMT1Sjs5Pug5uOMU8M4ewfj7D2MtXd4apwrztBUh18FnqioKNlsNuXk5Li15+TkKCYmpsp9Hn74YY0YMUK33367JOnss89WYWGh7rjjDj344IOyWisvU7Lb7bLb7ZXag4ODPfYXvrrHzvrjgCSpRUO7oiL5hvSa8uSfIY5gnL2DcfYexto7anuca3Isv1q0HBISol69emnJkiWuNqfTqSVLlighIaHKfYqKiiqFGput/MomY4znivWQLbvLA0/HFhE+rgQAgMDhVzM8kpScnKyRI0eqd+/e6tOnj2bOnKnCwkKNGjVKknTzzTerVatWmj59uiTpyiuv1IwZM3TOOee4Tmk9/PDDuvLKK13Bpy7ZvIfAAwBAbfO7wDNs2DDt2bNHkydPVnZ2tnr27KlFixa5FjJv377dbUbnoYceksVi0UMPPaRdu3apefPmuvLKK/Xoo4/66i2cFmZ4AACofX4XeCRp3LhxGjduXJXb0tLS3J4HBQUpJSVFKSkpXqjM87bsKZRUftNBAABQO/xqDU99V1xapm37ygMPMzwAANQeAo8fydpbJKeRGtqD1KJh5avIAADAqSHw+JHfDi9Ybt+8gSwWi4+rAQAgcBB4/MiOP8vvGBnXrIGPKwEAILAQePzI9v3lgadN0zAfVwIAQGAh8PiRHfsPSpLaNOEOywAA1CYCjx+pOKXVtimBBwCA2kTg8RNOp9HOPw/P8BB4AACoVQQeP7HnQLFKSp2yWS1q2SjU1+UAABBQCDx+omLBcmzjUAXZ+GMBAKA28cnqJ3ZUXKHFgmUAAGodgcdPuNbvEHgAAKh1BB4/8UfeIUlSDOt3AACodQQeP5GTT+ABAMBTCDx+IrtihieSwAMAQG0j8PiJihmeaAIPAAC1jsDjB4pLy7SvsEQSp7QAAPAEAo8f2J1fLEkKCbKqSXiwj6sBACDwEHj8wJHTWXZZLBYfVwMAQOAh8PiB7HwWLAMA4EkEHj9QcYUWC5YBAPAMAo8f2F1QvoaHwAMAgGcQePzA3sOBp0VDu48rAQAgMBF4/MDew5ekN20Q4uNKAAAITAQeP7C/sHyGJyqCGR4AADyBwOMH9h1ghgcAAE8i8PiYMcYVeJpFEHgAAPAEAo+PHSguVUmZU5LUrAGntAAA8AQCj49VzO6Eh9gUFmLzcTUAAAQmAo+P7Tu8YJnTWQAAeA6Bx8dc63c4nQUAgMcQeHxsX2FF4GGGBwAATyHw+Nj+Qq7QAgDA0wg8Prb3QPkanqac0gIAwGMIPD62n1NaAAB4HIHHx3KLHJKkxuHBPq4EAIDAReDxsbyD5YGnURiBBwAATyHw+Fg+gQcAAI8j8PiYa4aHU1oAAHgMgceHjDGc0gIAwAsIPD5UVFKmUqeRROABAMCTCDw+VDG7E2yzKCyYLw4FAMBTCDw+dPTpLIvF4uNqAAAIXAQeH6oIPJGczgIAwKMIPD4059ssSazfAQDA0wg8PrTop2xJ0s+/5/u4EgAAAhuBxw8Ulzp9XQIAAAGNwOMjxaVlvi4BAIB6g8DjI4XFBB4AALyFwOMjBw6Vuh5f1SPWh5UAABD4CDw+cqD4SOCZdnU3H1YCAEDgI/D4SGFJeeCJbxbOF4cCAOBhBB4fKCl16r9f/SZJamAP8nE1AAAEPgKPD7zyzW/6cmOOJCmCwAMAgMcReHwg9ecc12MCDwAAnkfg8YG123NdjzmlBQCA5xF4vOyPvINuzwk8AAB4HoHHyxKmL3V7HmG3+agSAADqDwKPF63bkVupLTyEGR4AADyNwONFt7+5qlLbzj8PVtETAADUJgKPF+0pKK7U9uvuAh9UAgBA/ULg8bFmDUJ8XQIAAAGPwONj3Vs39nUJAAAEPL8MPLNnz1Z8fLxCQ0PVt29frVy58oT9c3NzNXbsWLVs2VJ2u11nnnmmFi5c6KVqT89tF7bzdQkAAAQ8v7tEaN68eUpOTtaLL76ovn37aubMmUpKSlJmZqZatGhRqX9JSYkGDx6sFi1a6L333lOrVq20bds2NW7c2PvF19B9l3RWZChfHAoAgKf5XeCZMWOGRo8erVGjRkmSXnzxRX322Wd67bXXdP/991fq/9prr2n//v367rvvFBxcHh7i4+O9WfIp4x48AAB4h18FnpKSEq1evVqTJk1ytVmtViUmJio9Pb3KfT7++GMlJCRo7Nix+uijj9S8eXPdeOONuu+++2SzVR0oiouLVVx85Iqp/Px8SZLD4ZDD4ajFdyTX8RwOhwZ3aaHUjbtd24KtqvXXq6+OHmd4DuPsHYyz9zDW3uGpca7J8fwq8Ozdu1dlZWWKjo52a4+OjtYvv/xS5T6//fabli5dqptuukkLFy7U5s2bdffdd8vhcCglJaXKfaZPn66pU6dWal+8eLHCw8NP/41UITU1Vb9nW3X0sinrrnVamL3OI69XX6Wmpvq6hHqBcfYOxtl7GGvvqO1xLioqqnZfvwo8p8LpdKpFixZ66aWXZLPZ1KtXL+3atUtPPvnkcQPPpEmTlJyc7Hqen5+vNm3aaMiQIYqMjKzV+hwOh1JTUzV48GC9t2e99Oc+17ZrrrysVl+rPjt6nCtObaL2Mc7ewTh7D2PtHZ4a54ozNNXhV4EnKipKNptNOTk5bu05OTmKiYmpcp+WLVsqODjY7fRVly5dlJ2drZKSEoWEVL7Pjd1ul91ur9QeHBzssb/wwcHBKnWWP04efKb+fl4c/3F5gCf/DHEE4+wdjLP3MNbeUdvjXJNj+dVl6SEhIerVq5eWLFnianM6nVqyZIkSEhKq3Kdfv37avHmznE6nq23Tpk1q2bJllWHHlxxl5TWeGd1QTbnhIAAAXuNXgUeSkpOT9fLLL+uNN97Qxo0bNWbMGBUWFrqu2rr55pvdFjWPGTNG+/fv1/jx47Vp0yZ99tlneuyxxzR27FhfvYXjqgg8wTaLjysBAKB+8atTWpI0bNgw7dmzR5MnT1Z2drZ69uypRYsWuRYyb9++XVbrkZzWpk0bffHFF7rnnnvUvXt3tWrVSuPHj9d9993nq7dwXCVlRpIUbPO7nAkAQEDzu8AjSePGjdO4ceOq3JaWllapLSEhQd9//72Hqzo9a7fnauMf5YurCDwAAHgXn7xecvOcVa7HIUGc0gIAwJsIPF5yyHFkUTUzPAAAeBefvF5QUub+nMADAIB38cnrBZ/tcB9mAg8AAN7FJ68XbMx1X7MTQuABAMCr+OT1gSDuwwMAgFcReHyAU1oAAHgXn7w+wCktAAC8i09eH7BxSgsAAK8i8PiAPYhhBwDAm/jk9QJj3J+zhgcAAO/ik9fLurWK9HUJAADUOwQeLwuyMuQAAHgbn75eFmRlwTIAAN7m8cCTlpbm6Zfwe7sPHQk53HQQAADv81jg+fbbbzVo0CANGjTIUy9RJ3FKCwAA7wuq6Q4Oh0Nvv/22Vq9eraCgIF1wwQW69tprXdszMjJ0//33KzU1VcYY9e7du1YLrutiG4f6ugQAAOqdGgWegoIC9e/fX+vXr5c5fK31rFmzdO2112r+/PmaPHmyHnvsMTmdTp177rmaMmWKrrjiCo8UXlfdPbCjr0sAAKDeqVHg+fe//61169apR48euummmyRJ//vf//TBBx/ohhtu0LvvvquOHTvqqaee0lVXXeWRguu6iNAaT6oBAIDTVKNP348++khxcXFasWKFQkJCJEnjxo1T586dNX/+fF166aX64IMPZLfbPVJsIOAqLQAAvK9GK2h/++03XXbZZa6wI0mhoaG6/PLLJUlPPfUUYeckLBYCDwAA3lajwHPw4EFFR0dXam/RooUkqVOnTrVTFQAAQC2q1WukrVxyXaWujZ2ux3xxKAAA3lfjFbQbNmzQu+++W6lNkubPn++6euto119//SmWFxgaHT4DeHarRgoNtvm2GAAA6qEaB573339f77//vltbRci54YYbKrVbLJZ6H3ichzPgpWfH+LYQAADqqRoFnsmTJ7Po9hRUzHlZGTsAAHyiRoFnypQpHiojsB0JPD4tAwCAeqtGK2hvvfVWffzxx56qJWBVLGtihgcAAN+oUeCZM2eOMjIyPFRKYCoudarscODhdCAAAL7B9xx4UFFJqc59dKlKSstzJae0AADwDW4K40Frt+eqpPTIPXg4pQUAgG8QeLyIGR4AAHyjxqe0FixYoKysrGr3t1gsevXVV2v6MgHh2HzDGh4AAHyjxoEnIyOjRguX63PgORantAAA8I0aB55bbrlFI0eO9EQtgeeYfMMpLQAAfKPGgSc+Pl4DBgzwRC0BjxkeAAB8g0XLHmQ5ZoqHvAMAgG8QeLyIGR4AAHyDwONFNhbxAADgEzUKPK+//rpsNpseeOABORyO4/YrKSnRAw88oMcff/y0CwwkTPAAAOAbNQo8rVq10uTJk9WsWTMFBwcft19ISIiioqL04IMPatmyZaddZF11bMDhlBYAAL5Ro8Dz5ptvqkmTJho3btxJ+44dO1ZNmzbV66+/fsrFBRoCDwAAvlGjwPPdd98pMTFRdrv9pH3tdrsSExP17bffnnJxdd2x8YYlPAAA+EaNAs/vv/+u9u3bV7t/u3bt9Mcff9S4qEDFV0sAAOAbNQo8Vqv1hIuVj+VwOGS11t8LwY4NOMzwAADgGzVKI7GxsdqwYUO1+2/YsEGtWrWqcVGBijU8AAD4Ro0Cz4UXXqilS5dW69vSs7KytHTpUvXv3/9Uaws49XiyCwAAn6rRR/DYsWPlcDj0t7/9TXv37j1uv3379um6665TaWmpxowZc9pFBgrW8AAA4Bs1+vLQc889VxMmTNDMmTPVtWtX3XXXXbrooovUunVrSdKuXbu0ZMkSvfTSS9qzZ4+Sk5N17rnneqTwuohTWgAA+EaNvy396aefVmhoqJ588kk9+uijevTRR922G2Nks9k0adIkPfLII7VWaF1U+caDvqkDAID6rsaBx2Kx6LHHHtNtt92m119/Xd99952ys7MlSTExMerXr59uueUWdejQodaLreuY4QEAwDdqHHgqdOjQod7P4JzMsfGGvAMAgG9w3RAAAAh4BB4PYkYHAAD/QOABAAABj8ADAAACHoEHAAAEPAKPR7GIBwAAf0DgAQAAAY/A40FcpQUAgH8g8AAAgIBH4PEgJngAAPAPBB4AABDw/DbwzJ49W/Hx8QoNDVXfvn21cuXKau03d+5cWSwWDR061LMFAgCAOsMvA8+8efOUnJyslJQUrVmzRj169FBSUpJ27959wv2ysrL0j3/8QxdeeKGXKgUAAHWBXwaeGTNmaPTo0Ro1apS6du2qF198UeHh4XrttdeOu09ZWZluuukmTZ06Ve3bt/ditcdn4TItAAD8QpCvCzhWSUmJVq9erUmTJrnarFarEhMTlZ6eftz9/vWvf6lFixa67bbb9PXXX5/wNYqLi1VcXOx6np+fL0lyOBxyOByn+Q6OKC0tdW9wOmv1+DiiYlwZX89inL2DcfYexto7PDXONTme3wWevXv3qqysTNHR0W7t0dHR+uWXX6rc55tvvtGrr76qjIyMar3G9OnTNXXq1ErtixcvVnh4eI1rPp5tB6Sjhzjnp3Qt/LnWDo8qpKam+rqEeoFx9g7G2XsYa++o7XEuKiqqdl+/Czw1VVBQoBEjRujll19WVFRUtfaZNGmSkpOTXc/z8/PVpk0bDRkyRJGRkbVW2/qdeZrx4wrX8ysuv6zWjg13DodDqampGjx4sIKDg31dTsBinL2DcfYexto7PDXOFWdoqsPvAk9UVJRsNptycnLc2nNychQTE1Op/5YtW5SVlaUrr7zS1eZ0OiVJQUFByszMVIcOHdz2sdvtstvtlY4VHBxcq38QwcFBxzznPyZPq+0/Q1SNcfYOxtl7GGvvqP3P2eofy+8WLYeEhKhXr15asmSJq83pdGrJkiVKSEio1L9z58768ccflZGR4fq56qqrdNFFFykjI0Nt2rTxZvkAAMAP+d0MjyQlJydr5MiR6t27t/r06aOZM2eqsLBQo0aNkiTdfPPNatWqlaZPn67Q0FB169bNbf/GjRtLUqV2AABQP/ll4Bk2bJj27NmjyZMnKzs7Wz179tSiRYtcC5m3b98uq9XvJqcAAICf8svAI0njxo3TuHHjqtyWlpZ2wn3nzJlT+wWdAgvfpgUAgF9gmgQAAAQ8Ao8HcaNlAAD8A4EHAAAEPAIPAAAIeAQeAAAQ8Ag8AAAg4BF4AABAwCPweBBXaQEA4B8IPAAAIOAReDyIOy0DAOAfCDwAACDgEXg8iDU8AAD4BwIPAAAIeAQeAAAQ8Ag8AAAg4BF4PIg1PAAA+AcCDwAACHgEHg/iPjwAAPgHAg8AAAh4BB4PYg0PAAD+gcADAAACHoEHAAAEPAIPAAAIeAQeD2IJDwAA/oHAAwAAAh6BBwAABDwCDwAACHgEHgAAEPAIPB5kfF0AAACQROABAAD1AIEHAAAEPAIPAAAIeAQeAAAQ8Ag8AAAg4BF4AABAwCPwAACAgEfg8SDDjXgAAPALBB4AABDwCDwAACDgEXgAAEDAI/AAAICAR+ABAAABj8ADAAACHoEHAAAEPAKPBxlxIx4AAPwBgQcAAAQ8Ag8AAAh4BB4AABDwCDxecslZ0b4uAQCAeovA4yUzrjvb1yUAAFBvEXi8oGGwUbCNoQYAwFf4FAYAAAGPwONBhtvwAADgFwg8AAAg4BF4AABAwCPwAACAgEfgAQAAAY/A4wUWXxcAAEA9R+ABAAABj8ADAAACHoHHg7gPDwAA/oHAAwAAAh6BBwAABDy/DTyzZ89WfHy8QkND1bdvX61cufK4fV9++WVdeOGFatKkiZo0aaLExMQT9gcAAPWLXwaeefPmKTk5WSkpKVqzZo169OihpKQk7d69u8r+aWlpGj58uJYtW6b09HS1adNGQ4YM0a5du7xcOQAA8Ed+GXhmzJih0aNHa9SoUeratatefPFFhYeH67XXXquy/1tvvaW7775bPXv2VOfOnfXKK6/I6XRqyZIlXq4cAAD4oyBfF3CskpISrV69WpMmTXK1Wa1WJSYmKj09vVrHKCoqksPhUNOmTavcXlxcrOLiYtfz/Px8SZLD4ZDD4TiN6t2Vlpa6HtfmcVFZxfgyzp7FOHsH4+w9jLV3eGqca3I8vws8e/fuVVlZmaKjo93ao6Oj9csvv1TrGPfdd59iY2OVmJhY5fbp06dr6tSpldoXL16s8PDwmhd9HLsKpYohTk1NrbXj4vgYZ+9gnL2DcfYexto7anuci4qKqt3X7wLP6Xr88cc1d+5cpaWlKTQ0tMo+kyZNUnJysut5fn6+a91PZGRkrdXy8x/50vrvJUmDBw9WcHBwrR0b7hwOh1JTUxlnD2OcvYNx9h7G2js8Nc4VZ2iqw+8CT1RUlGw2m3Jyctzac3JyFBMTc8J9n3rqKT3++OP68ssv1b179+P2s9vtstvtldqDg4Nr9Q8iKOjI8Nb2sVE1xtk7GGfvYJy9h7H2jtoe55ocy+8WLYeEhKhXr15uC44rFiAnJCQcd78nnnhC06ZN06JFi9S7d29vlAoAAOoIv5vhkaTk5GSNHDlSvXv3Vp8+fTRz5kwVFhZq1KhRkqSbb75ZrVq10vTp0yVJ//73vzV58mS9/fbbio+PV3Z2tiQpIiJCERERPnsfAADAP/hl4Bk2bJj27NmjyZMnKzs7Wz179tSiRYtcC5m3b98uq/XI5NQLL7ygkpIS/e1vf3M7TkpKiqZMmeLN0qtk8XUBAADUc34ZeCRp3LhxGjduXJXb0tLS3J5nZWV5viAAAFBn+d0aHgAAgNpG4AEAAAGPwONBxvi6AgAAIBF4AABAPUDgAQAAAY/AAwAAAh6Bxxu4EQ8AAD5F4AEAAAGPwAMAAAIegQcAAAQ8Ag8AAAh4BB4AABDwCDwAACDgEXgAAEDAI/B4AbfhAQDAtwg8AAAg4BF4AABAwCPwAACAgEfg8SBjfF0BAACQCDwAAKAeIPAAAICAR+ABAAABj8ADAAACHoEHAAAEPAIPAAAIeAQeAAAQ8Ag8HmTEjXgAAPAHBB4AABDwCDwAACDgEXi8wOLrAgAAqOcIPAAAIOAReAAAQMAj8AAAgIBH4AEAAAGPwONBhtvwAADgFwg8AAAg4BF4AABAwCPweIGFG/EAAOBTBB4AABDwCDwAACDgEXgAAEDAI/AAAICAR+DxIG7DAwCAfyDwAACAgEfgAQAAAY/AAwAAAh6BBwAABDwCDwAACHgEHgAAEPAIPAAAIOAReDzIGO7EAwCAPyDwAACAgEfg8QKLrwsAAKCeI/AAAICAR+ABAAABj8ADAAACHoEHAAAEPAIPAAAIeAQeD+IuPAAA+AcCDwAACHgEHgAAEPAIPAAAIOD5beCZPXu24uPjFRoaqr59+2rlypUn7D9//nx17txZoaGhOvvss7Vw4UIvVQoAAPydXwaeefPmKTk5WSkpKVqzZo169OihpKQk7d69u8r+3333nYYPH67bbrtNa9eu1dChQzV06FBt2LDBy5UDAAB/5JeBZ8aMGRo9erRGjRqlrl276sUXX1R4eLhee+21KvvPmjVLl1xyiSZOnKguXbpo2rRpOvfcc/Xcc895uXIAAOCP/C7wlJSUaPXq1UpMTHS1Wa1WJSYmKj09vcp90tPT3fpLUlJS0nH7AwCA+iXI1wUca+/evSorK1N0dLRbe3R0tH755Zcq98nOzq6yf3Z2dpX9i4uLVVxc7Hqel5cnSdq/f78cDsfplO8m9888OYuLVCajffv2KTg4uNaODXcOh0NFRUWMs4cxzt7BOHsPY+0dnhrngoICSZIxJ7/znd8FHm+YPn26pk6dWqm9Xbt2Hnm9HZJa/tsjhwYAoN4rKChQo0aNTtjH7wJPVFSUbDabcnJy3NpzcnIUExNT5T4xMTE16j9p0iQlJye7njudTu3fv1/NmjWTxWI5zXfgLj8/X23atNGOHTsUGRlZq8fGEYyzdzDO3sE4ew9j7R2eGmdjjAoKChQbG3vSvn4XeEJCQtSrVy8tWbJEQ4cOlVQeSJYsWaJx48ZVuU9CQoKWLFmiCRMmuNpSU1OVkJBQZX+73S673e7W1rhx49oo/7giIyP5j8kLGGfvYJy9g3H2HsbaOzwxzieb2angd4FHkpKTkzVy5Ej17t1bffr00cyZM1VYWKhRo0ZJkm6++Wa1atVK06dPlySNHz9eAwYM0NNPP63LL79cc+fO1apVq/TSSy/58m0AAAA/4ZeBZ9iwYdqzZ48mT56s7Oxs9ezZU4sWLXItTN6+fbus1iMXmJ1//vl6++239dBDD+mBBx7QGWecoQULFqhbt26+egsAAMCP+GXgkaRx48Yd9xRWWlpapbbrrrtO1113nYerqjm73a6UlJRKp9BQuxhn72CcvYNx9h7G2jv8YZwtpjrXcgEAANRhfnfjQQAAgNpG4AEAAAGPwAMAAAIegQcAAAQ8Ao8HzZ49W/Hx8QoNDVXfvn21cuVKX5fk15YvX64rr7xSsbGxslgsWrBggdt2Y4wmT56sli1bKiwsTImJifr111/d+uzfv1833XSTIiMj1bhxY9122206cOCAW5/169frwgsvVGhoqNq0aaMnnnjC02/Nr0yfPl1/+ctf1LBhQ7Vo0UJDhw5VZmamW59Dhw5p7NixatasmSIiIvTXv/610t3Mt2/frssvv1zh4eFq0aKFJk6cqNLSUrc+aWlpOvfcc2W329WxY0fNmTPH02/Pb7zwwgvq3r2760ZrCQkJ+vzzz13bGWPPePzxx2WxWNxuRMtYn74pU6bIYrG4/XTu3Nm1vU6MsYFHzJ0714SEhJjXXnvN/PTTT2b06NGmcePGJicnx9el+a2FCxeaBx980HzwwQdGkvnwww/dtj/++OOmUaNGZsGCBWbdunXmqquuMu3atTMHDx509bnkkktMjx49zPfff2++/vpr07FjRzN8+HDX9ry8PBMdHW1uuukms2HDBvPOO++YsLAw89///tdbb9PnkpKSzOuvv242bNhgMjIyzGWXXWbatm1rDhw44Opz1113mTZt2pglS5aYVatWmfPOO8+cf/75ru2lpaWmW7duJjEx0axdu9YsXLjQREVFmUmTJrn6/PbbbyY8PNwkJyebn3/+2Tz77LPGZrOZRYsWefX9+srHH39sPvvsM7Np0yaTmZlpHnjgARMcHGw2bNhgjGGMPWHlypUmPj7edO/e3YwfP97VzlifvpSUFHPWWWeZP/74w/WzZ88e1/a6MMYEHg/p06ePGTt2rOt5WVmZiY2NNdOnT/dhVXXHsYHH6XSamJgY8+STT7racnNzjd1uN++8844xxpiff/7ZSDI//PCDq8/nn39uLBaL2bVrlzHGmOeff940adLEFBcXu/rcd999plOnTh5+R/5r9+7dRpL56quvjDHl4xocHGzmz5/v6rNx40YjyaSnpxtjysOp1Wo12dnZrj4vvPCCiYyMdI3tP//5T3PWWWe5vdawYcNMUlKSp9+S32rSpIl55ZVXGGMPKCgoMGeccYZJTU01AwYMcAUexrp2pKSkmB49elS5ra6MMae0PKCkpESrV69WYmKiq81qtSoxMVHp6ek+rKzu2rp1q7Kzs93GtFGjRurbt69rTNPT09W4cWP17t3b1ScxMVFWq1UrVqxw9enfv79CQkJcfZKSkpSZmak///zTS+/Gv+Tl5UmSmjZtKklavXq1HA6H21h37txZbdu2dRvrs88+23X3c6l8HPPz8/XTTz+5+hx9jIo+9fG/gbKyMs2dO1eFhYVKSEhgjD1g7NixuvzyyyuNB2Nde3799VfFxsaqffv2uummm7R9+3ZJdWeMCTwesHfvXpWVlbn9wUpSdHS0srOzfVRV3VYxbica0+zsbLVo0cJte1BQkJo2berWp6pjHP0a9YnT6dSECRPUr18/11exZGdnKyQkpNIX6h471icbx+P1yc/P18GDBz3xdvzOjz/+qIiICNntdt1111368MMP1bVrV8a4ls2dO1dr1qxxfb/i0Rjr2tG3b1/NmTNHixYt0gsvvKCtW7fqwgsvVEFBQZ0ZY7/9agkAnjd27Fht2LBB33zzja9LCUidOnVSRkaG8vLy9N5772nkyJH66quvfF1WQNmxY4fGjx+v1NRUhYaG+rqcgHXppZe6Hnfv3l19+/ZVXFyc3n33XYWFhfmwsupjhscDoqKiZLPZKq1Qz8nJUUxMjI+qqtsqxu1EYxoTE6Pdu3e7bS8tLdX+/fvd+lR1jKNfo74YN26cPv30Uy1btkytW7d2tcfExKikpES5ublu/Y8d65ON4/H6REZG1pl/IE9XSEiIOnbsqF69emn69Onq0aOHZs2axRjXotWrV2v37t0699xzFRQUpKCgIH311Vf6z3/+o6CgIEVHRzPWHtC4cWOdeeaZ2rx5c535+0zg8YCQkBD16tVLS5YscbU5nU4tWbJECQkJPqys7mrXrp1iYmLcxjQ/P18rVqxwjWlCQoJyc3O1evVqV5+lS5fK6XSqb9++rj7Lly+Xw+Fw9UlNTVWnTp3UpEkTL70b3zLGaNy4cfrwww+1dOlStWvXzm17r169FBwc7DbWmZmZ2r59u9tY//jjj24BMzU1VZGRkerataurz9HHqOhTn/8bcDqdKi4uZoxr0aBBg/Tjjz8qIyPD9dO7d2/ddNNNrseMde07cOCAtmzZopYtW9adv8+1svQZlcydO9fY7XYzZ84c8/PPP5s77rjDNG7c2G2FOtwVFBSYtWvXmrVr1xpJZsaMGWbt2rVm27Ztxpjyy9IbN25sPvroI7N+/Xpz9dVXV3lZ+jnnnGNWrFhhvvnmG3PGGWe4XZaem5troqOjzYgRI8yGDRvM3LlzTXh4eL26LH3MmDGmUaNGJi0tze0S06KiIlefu+66y7Rt29YsXbrUrFq1yiQkJJiEhATX9opLTIcMGWIyMjLMokWLTPPmzau8xHTixIlm48aNZvbs2fXqMt7777/ffPXVV2br1q1m/fr15v777zcWi8UsXrzYGMMYe9LRV2kZw1jXhnvvvdekpaWZrVu3mm+//dYkJiaaqKgos3v3bmNM3RhjAo8HPfvss6Zt27YmJCTE9OnTx3z//fe+LsmvLVu2zEiq9DNy5EhjTPml6Q8//LCJjo42drvdDBo0yGRmZrodY9++fWb48OEmIiLCREZGmlGjRpmCggK3PuvWrTMXXHCBsdvtplWrVubxxx/31lv0C1WNsSTz+uuvu/ocPHjQ3H333aZJkyYmPDzcXHPNNeaPP/5wO05WVpa59NJLTVhYmImKijL33nuvcTgcbn2WLVtmevbsaUJCQkz79u3dXiPQ3XrrrSYuLs6EhISY5s2bm0GDBrnCjjGMsScdG3gY69M3bNgw07JlSxMSEmJatWplhg0bZjZv3uzaXhfG2GKMMbUzVwQAAOCfWMMDAAACHoEHAAAEPAIPAAAIeAQeAAAQ8Ag8AAAg4BF4AABAwCPwAACAgEfgAeBRFotFAwcO9HUZtSYtLU0Wi0VTpkzxdSkAaoDAA8DrbrnlFlksFmVlZfm6lCoFWkgDIAX5ugAAgW3jxo0KDw/3dRm1pk+fPtq4caOioqJ8XQqAGiDwAPCozp07+7qEWhUeHh5w7wmoDzilBUCS+9qUVatWafDgwWrYsKEaNWqka6655pRPPx17eig+Pl5vvPGGJKldu3ayWCxVnkLaunWrbr/9drVt21Z2u10tW7bULbfcom3bth33NXbt2qWbb75ZMTExslqtSktLkyQtW7ZMt956qzp16qSIiAhFRESod+/eeumll6ocA0n66quvXLVZLBbNmTOn0jgda8OGDbr++uvVokUL2e12tWvXThMmTNC+ffsq9Y2Pj1d8fLwOHDig8ePHKzY2Vna7Xd27d9d7771XqX9eXp4mT56srl27KiIiQpGRkerYsaNGjhxZ5ZgAcMcMDwA3P/zwg5544glddNFFuvPOO7V27VotWLBAP/74ozZs2KDQ0NDTOv6ECRM0Z84crVu3TuPHj1fjxo0llQeACitWrFBSUpIKCwt1xRVX6IwzzlBWVpbeeustff7550pPT1f79u3djrtv3z4lJCSoadOmuuGGG3To0CFFRkZKkv79739r8+bNOu+883TNNdcoNzdXixYt0p133qnMzEw9/fTTrhpSUlI0depUxcXF6ZZbbnEdv2fPnid8X998842SkpJUUlKiv/3tb4qPj1d6erpmzZqlTz/9VN9//32l02AOh0NDhgzRn3/+qb/+9a8qKirS3Llzdf3112vRokUaMmSIJMkYo6SkJK1YsUL9+vXTJZdcIqvVqm3btunjjz/WiBEjFBcXdwp/GkA9Umvfuw6gTlu2bJmRZCSZuXPnum0bMWKEkWTeeeedGh9XkhkwYIBb28iRI40ks3Xr1kr9S0pKTHx8vGnYsKFZs2aN27avv/7a2Gw2c8UVV1R6DUlm1KhRprS0tNIxf/vtt0ptDofDDB482NhsNrNt27aT1lyhYpxSUlJcbWVlZaZDhw5Gklm0aJFb/4kTJxpJ5tZbb3Vrj4uLM5LM1VdfbYqLi13tX375pZFkkpKSXG3r1683kszQoUMr1XPo0CFTUFBQZa0AjuCUFgA3/fv317Bhw9zabr31Vknlsz+e9umnnyorK0sTJ07UOeec47btggsu0NVXX62FCxcqPz/fbVtISIieeOIJ2Wy2Ssds165dpbagoCDdddddKisr07Jly06r5m+//VZbtmzRpZdeqqSkJLdtkydPVtOmTfX222+rpKSk0r7PPPOMQkJCXM8HDRqkuLi4Ksc6LCysUpvdbldERMRp1Q/UB5zSAuCmV69eldpat24tScrNzfX463///feSpMzMzCrXyWRnZ8vpdGrTpk3q3bu3q71du3bHvXKqoKBATz31lBYsWKAtW7aosLDQbfvvv/9+WjWvXbtWkqq8lL1ivdDixYuVmZmps88+27WtcePGVYax1q1bKz093fW8S5cu6t69u9555x3t3LlTQ4cO1cCBA9WzZ09Zrfx/K1AdBB4AbirWvRwtKKj8n4qysjKPv/7+/fslSW+99dYJ+x0bWqKjo6vsV1JSooEDB2rNmjU655xzNGLECDVr1kxBQUHKysrSG2+8oeLi4tOquWK26Xg1tGzZ0q1fhUaNGlXZPygoSE6n0+350qVLNWXKFL3//vu69957JUnNmzfXuHHj9OCDD1Y5swXgCAIPAL9SEbg++eQTXXHFFdXer+LqqmN99NFHWrNmjW677Ta98sorbtvmzp3rumLsdFTUnJOTU+X27Oxst36nolmzZnr22Wf1n//8R7/88ouWLl2qZ599VikpKQoODtakSZNO+dhAfcBcKACvq5iNqGrGqG/fvpLkdkrndGzZskWSdPXVV1fa9vXXX1e5j9VqrdFsVsVao4rL4I9WWFioVatWKSwsTJ06dar2MY/HYrGoS5cuGjt2rFJTUyVJH3/88WkfFwh0BB4AXte0aVNJ0o4dOyptu/rqq9W2bVvNmDFDy5cvr7Td4XDom2++qfZrVVyufew+X331lV5++eXj1rdz585qv0a/fv3UoUMHff755/ryyy/dtj3yyCPat2+fhg8f7rY4uSaysrKqvA9SxYzS6d4qAKgPOKUFwOsuvvhiPfXUU7rjjjv017/+VQ0aNFBcXJxGjBghu92u9957T5deeqkGDBigiy++WGeffbYsFou2bdumr7/+Ws2aNdMvv/xSrde68sorFR8fryeeeEIbNmxQt27dlJmZqU8//VTXXHNNlTf5u/jii/Xuu+9q6NChOuecc2Sz2XTVVVepe/fuVb6G1WrVnDlzlJSUpMsuu0zXXXed4uLilJ6errS0NHXo0EGPP/74KY9XRkaGrr32WvXp00ddu3ZVTEyMdu3apQULFshqteqee+455WMD9QWBB4DXXXrppXriiSf08ssv6+mnn5bD4dCAAQM0YsQISdJf/vIXrVu3Tk8++aQWLlyob7/9Vna7Xa1atdLQoUM1fPjwar9WRESEli5dqokTJ2r58uVKS0vTWWedpbfeekvR0dFVBp5Zs2ZJkpYuXapPPvlETqdTrVu3Pm7gkcovmf/+++/1r3/9S4sXL1ZeXp5iY2M1fvx4PfTQQ6f13Vu9e/fWfffdp7S0NH322WfKzc1VTEyMEhMTNXHiRJ133nmnfGygvrAYY4yviwAAAPAk1vAAAICAR+ABAAABjzU8AGpk5syZ1brj8i233OL2haAA4Eus4QFQI/Hx8dq2bdtJ+y1btqzKr1oAAF8g8AAAgIDHGh4AABDwCDwAACDgEXgAAEDAI/AAAICAR+ABAAABj8ADAAACHoEHAAAEPAIPAAAIeAQeAAAQ8P5/jw6EJfC/9moAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "class FunkMFWithHack(reco.FunkMF):\n",
    "\n",
    "    def learn_one(self, user, item, reward, context):\n",
    "        user = f\"{user}@{context['time_of_day']}\"\n",
    "        return super().learn_one(user, item, reward, context)\n",
    "\n",
    "    def rank(self, user, items, context):\n",
    "        user = f\"{user}@{context['time_of_day']}\"\n",
    "        return super().rank(user, items, context)\n",
    "\n",
    "model = FunkMFWithHack(seed=29)\n",
    "simulate(5_000, get_reward, model, seed=42)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can verify that the model has learnt the correct preferences by looking at the expected preference for each `(user, item)` pair."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-12-04T17:50:32.304096Z",
     "iopub.status.busy": "2023-12-04T17:50:32.303646Z",
     "iopub.status.idle": "2023-12-04T17:50:32.346906Z",
     "shell.execute_reply": "2023-12-04T17:50:32.346642Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style type=\"text/css\">\n",
       "#T_efa54_row0_col5, #T_efa54_row1_col6, #T_efa54_row2_col4, #T_efa54_row3_col5 {\n",
       "  background-color: lightgreen;\n",
       "}\n",
       "</style>\n",
       "<table id=\"T_efa54\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th class=\"blank level0\" >&nbsp;</th>\n",
       "      <th id=\"T_efa54_level0_col0\" class=\"col_heading level0 col0\" colspan=\"7\">preference</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th class=\"index_name level1\" >item</th>\n",
       "      <th id=\"T_efa54_level1_col0\" class=\"col_heading level1 col0\" >camping</th>\n",
       "      <th id=\"T_efa54_level1_col1\" class=\"col_heading level1 col1\" >finance</th>\n",
       "      <th id=\"T_efa54_level1_col2\" class=\"col_heading level1 col2\" >food</th>\n",
       "      <th id=\"T_efa54_level1_col3\" class=\"col_heading level1 col3\" >health</th>\n",
       "      <th id=\"T_efa54_level1_col4\" class=\"col_heading level1 col4\" >music</th>\n",
       "      <th id=\"T_efa54_level1_col5\" class=\"col_heading level1 col5\" >politics</th>\n",
       "      <th id=\"T_efa54_level1_col6\" class=\"col_heading level1 col6\" >sports</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th class=\"index_name level0\" >user</th>\n",
       "      <th class=\"blank col0\" >&nbsp;</th>\n",
       "      <th class=\"blank col1\" >&nbsp;</th>\n",
       "      <th class=\"blank col2\" >&nbsp;</th>\n",
       "      <th class=\"blank col3\" >&nbsp;</th>\n",
       "      <th class=\"blank col4\" >&nbsp;</th>\n",
       "      <th class=\"blank col5\" >&nbsp;</th>\n",
       "      <th class=\"blank col6\" >&nbsp;</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th id=\"T_efa54_level0_row0\" class=\"row_heading level0 row0\" >Anna@afternoon</th>\n",
       "      <td id=\"T_efa54_row0_col0\" class=\"data row0 col0\" >-0.018105</td>\n",
       "      <td id=\"T_efa54_row0_col1\" class=\"data row0 col1\" >0.032865</td>\n",
       "      <td id=\"T_efa54_row0_col2\" class=\"data row0 col2\" >0.069222</td>\n",
       "      <td id=\"T_efa54_row0_col3\" class=\"data row0 col3\" >-0.059041</td>\n",
       "      <td id=\"T_efa54_row0_col4\" class=\"data row0 col4\" >0.168353</td>\n",
       "      <td id=\"T_efa54_row0_col5\" class=\"data row0 col5\" >1.000000</td>\n",
       "      <td id=\"T_efa54_row0_col6\" class=\"data row0 col6\" >0.195960</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_efa54_level0_row1\" class=\"row_heading level0 row1\" >Anna@morning</th>\n",
       "      <td id=\"T_efa54_row1_col0\" class=\"data row1 col0\" >-0.117577</td>\n",
       "      <td id=\"T_efa54_row1_col1\" class=\"data row1 col1\" >0.081131</td>\n",
       "      <td id=\"T_efa54_row1_col2\" class=\"data row1 col2\" >0.076300</td>\n",
       "      <td id=\"T_efa54_row1_col3\" class=\"data row1 col3\" >-0.136399</td>\n",
       "      <td id=\"T_efa54_row1_col4\" class=\"data row1 col4\" >0.154483</td>\n",
       "      <td id=\"T_efa54_row1_col5\" class=\"data row1 col5\" >0.221890</td>\n",
       "      <td id=\"T_efa54_row1_col6\" class=\"data row1 col6\" >1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_efa54_level0_row2\" class=\"row_heading level0 row2\" >Tom@afternoon</th>\n",
       "      <td id=\"T_efa54_row2_col0\" class=\"data row2 col0\" >0.057220</td>\n",
       "      <td id=\"T_efa54_row2_col1\" class=\"data row2 col1\" >-0.027115</td>\n",
       "      <td id=\"T_efa54_row2_col2\" class=\"data row2 col2\" >-0.074671</td>\n",
       "      <td id=\"T_efa54_row2_col3\" class=\"data row2 col3\" >-0.233071</td>\n",
       "      <td id=\"T_efa54_row2_col4\" class=\"data row2 col4\" >1.000000</td>\n",
       "      <td id=\"T_efa54_row2_col5\" class=\"data row2 col5\" >0.163607</td>\n",
       "      <td id=\"T_efa54_row2_col6\" class=\"data row2 col6\" >0.141781</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_efa54_level0_row3\" class=\"row_heading level0 row3\" >Tom@morning</th>\n",
       "      <td id=\"T_efa54_row3_col0\" class=\"data row3 col0\" >-0.028562</td>\n",
       "      <td id=\"T_efa54_row3_col1\" class=\"data row3 col1\" >-0.005428</td>\n",
       "      <td id=\"T_efa54_row3_col2\" class=\"data row3 col2\" >0.061163</td>\n",
       "      <td id=\"T_efa54_row3_col3\" class=\"data row3 col3\" >-0.050107</td>\n",
       "      <td id=\"T_efa54_row3_col4\" class=\"data row3 col4\" >0.063483</td>\n",
       "      <td id=\"T_efa54_row3_col5\" class=\"data row3 col5\" >1.000000</td>\n",
       "      <td id=\"T_efa54_row3_col6\" class=\"data row3 col6\" >0.125515</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n"
      ],
      "text/plain": [
       "<pandas.io.formats.style.Styler at 0x1276b0590>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "(\n",
    "    pd.DataFrame(\n",
    "        {\n",
    "            'user': user,\n",
    "            'item': item,\n",
    "            'preference': model.predict_one(user, item)\n",
    "        }\n",
    "        for user in model.u_latents\n",
    "        for item in model.i_latents\n",
    "    )\n",
    "    .pivot(index='user', columns='item')\n",
    "    .style.highlight_max(color='lightgreen', axis='columns')\n",
    ")"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "e6e87bad9c8c768904c061eafcb4f6739260ff8bb57f302c215ab258ded773dc"
  },
  "kernelspec": {
   "display_name": "river",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
